﻿/**
 * @var number
 * @description: 版本号 
 * 20080320: 修改Bug：当$('table[0] tr.Class1')为null时，$('table[0] tr.Class1 div')选择出错
 * 20080321: 修改在Firefox下调用Ajax的Post方法而postBody没定义的话，出现401错误
 * 20080330: 修改Browser对象相关属性的定义 isMoz=>isGecko,  添加_$添加元素接口
 * 20080407: 添加json请求
 * 20080412: 修改$._$方法调用方式及部分Bug
 * 20080517: 添加_$对象对空元素的支持，添加常用的Dom方法到_$.propoty对象上,修改html对单元素的默认操作
 * 20080530: 添加$.Dom的常用方法至_$.prototype中，直接调用
 * 20080704: $.Dom._class 方法正则式修改,以匹配class中的-符号
 * 20080722: 添加$.Dom.bind方法，将$.Dom的方法绑定到_$中，提供_$中第一个元素的直接调用
 */
var $version = 20080722;

/**
 * @function
 * @description: 传入一个可枚举的对象，输出一个组数对象。
 * @params: object
 * @example:
 	function foo () {
 		var args = $A(arguments);
 		alert(typeof args); 	// 'array'
 		var firstArg = args.pop(); 
 	}
 */
var $A = function (o) {
	var ret = [];
	for (var i = 0; i < o.length; i ++) ret.push(o[i]); 
	return ret;
};

/**
  * @var object 
  * @see $continue
  * @description :  用于跳出的异常对象
  * @example :
  	<script>
  	var collecter = [], count = 0;
  	[1,2,3,4,5,6,7,8].each (function (value) {
  		if (value % 2 == 1) throw $continue;
  		collecter.push(value);
  		if (++count == 2) throw $break;
  	});
  	alert(collecter); // collecter = [2,4]
  	</script>
  */ 
var $break = new Object();

/**
 * @var object
 * @see $break
 * @description: 跳出当前函数，继续下一次循环的异常对象
 */
var $continue = new Object();

/**
 * @function
 * @description: 传入一个HTML Element，输出一个_$对象.
 * @params: html_element
 * @example:
 	<html>
 	<div id="foo"></div>
 	</html>
 	<script>
 	var foo = $E('foo'); 
 	//相同的
 	var foo1 = $E(documnet.getElementById('foo')); 
 	</script>
 */
var $E = function (e) {
	if ($.isString(e)) return $( '#' + e);
	if ($.isElement(e)) return new _$(e);	
	return e;
};
 
/**
 * @var array
 * @description: 存储需要将部分属性导出到$作用域下的对象。
 *（要导出的对象必须设置了EXPORT属性。属性值可以为字符串'all'及数组。'all'表示导出该对象的所有属性。数组则定义需要导出的属性)
 * 导出后 $.observe 为 $.Event.observe的简单引用
 */
var $EXPORT = ['Event', 'Browser', 'Effect.Transitions'];

/**
 * @function
 * @description:将对象属性导入到$作用域下。默认导出$EXPORT变量中定义的对象。如果传递了参数则导出参数中定义的对象。
 */
function $export () {
	var toExport = [].concat(arguments[1] || $EXPORT);
	for (var i = 0; i < toExport.length; i ++) {
		var ns = toExport[i].split('.');
		var o = $;
		for (var j = 0; j < ns.length; j ++) o = o[ns[j]];
		if (o.EXPORT == undefined) continue;
		if ($.isString(o.EXPORT) && o.EXPORT.toLowerCase() == 'all') {
			for (var pro in o) {
				if (pro !== 'EXPORT' && ! (pro in $)) $[pro] = o[pro];
			}
			continue;
		}
		if ($.isArray(o.EXPORT)) {
			for (var j = 0; j <= o.EXPORT.length; j ++) {
				var pro = o.EXPORT[j], npro;
				if (/^(.+)=>(.+)$/.test(pro)) {
					pro = RegExp.$1;
					npro = RegExp.$2;	
				} else { npro = pro }
				if (! (npro in $)) {
					if ($.isFunction(o[pro])) {
						$[npro] = o[pro].bind(o);
					} else {
						$[npro] = o[pro];		
					}
				}
			}	
		}	
	}	
}
